import json
import os
import pathlib

default_param = {}
default_param['bins'] = 768
default_param['unstable_bins'] = 9 # training only
default_param['reduction_bins'] = 762 # training only
default_param['sr'] = 44100
default_param['pre_filter_start'] = 757
default_param['pre_filter_stop'] = 768
default_param['band'] = {}


default_param['band'][1] = {
    'sr': 11025,
    'hl': 128,
    'n_fft': 960,
    'crop_start': 0,
    'crop_stop': 245,
    'lpf_start': 61, # inference only
    'res_type': 'polyphase'
}

default_param['band'][2] = {
    'sr': 44100,
    'hl': 512,
    'n_fft': 1536,
    'crop_start': 24,
    'crop_stop': 547,
    'hpf_start': 81, # inference only
    'res_type': 'sinc_best'
}


def int_keys(d):
    r = {}
    for k, v in d:
        if k.isdigit():
            k = int(k)
        r[k] = v
    return r
    

class ModelParameters(object):
    def __init__(self, config_path=''):
        if '.pth' == pathlib.Path(config_path).suffix:
            import zipfile
            
            with zipfile.ZipFile(config_path, 'r') as zip:
                self.param = json.loads(zip.read('param.json'), object_pairs_hook=int_keys)
        elif '.json' == pathlib.Path(config_path).suffix:
            with open(config_path, 'r') as f:
                self.param = json.loads(f.read(), object_pairs_hook=int_keys)
        else:
            self.param = default_param
            
        for k in ['mid_side', 'mid_side_b', 'mid_side_b2', 'stereo_w', 'stereo_n', 'reverse']:
            if not k in self.param:
                self.param[k] = False